package utils
import(
	"fmt"
	"net"
	"ChatRoom/common/message"
	"encoding/json"
	"encoding/binary"
)

//将包中方法关联到结构体中
type Transfer struct{
	//分析有哪些字段
	Conn net.Conn	//一个连接
	Buf [8096]byte	//传输时使用的缓冲

}


//读取客户端发送过来的包体
func (this *Transfer)ReadPkg()(msg message.Message,err error){

	fmt.Println("读取客户端发送的数据...")

	//获取包体长度
	//conn.Read只有在conn没有被关闭的情况下才会阻塞，如果客户端关闭了conn,则就不会阻塞
	_,err =this.Conn.Read(this.Buf[:4])
	if err != nil{
		//获取包体长度报错
		//err = errors.New("获取包体长度报错")

		return
	}

	//将包体长度存储下来
	pkgLen := binary.BigEndian.Uint32(this.Buf[:4])

	//根据pkgLen读取消息内容
	n,err := this.Conn.Read(this.Buf[:pkgLen])
	if n!=int(pkgLen)||err != nil{
		//获取包体报错
		//err = errors.New("获取包体报错")

		return
	}

	//到这里已经成功读取到了完整包体
	err = json.Unmarshal(this.Buf[:pkgLen],&msg)
	if err!=nil {
		//包体内容反序列化报错
		//err = errors.New("包体内容反序列化报错")
		return
	}
	return
}

//给客户端发包
func (this *Transfer)WritePkg(data []byte)(err error){
	//先发送一个长度给对方
	var pkgLen uint32
	pkgLen = uint32(len(data))
	binary.BigEndian.PutUint32(this.Buf[:4],pkgLen)
	//发送长度
	n,err :=this.Conn.Write(this.Buf[:4])
	if n!=4||err!=nil {
		fmt.Println("conn.Write(header),err=",err)
		return
	}
	//发送data本身
	n,err =this.Conn.Write(data)
	if n!=int(pkgLen)|| err!=nil {
		fmt.Println("conn.Write(date),err=",err)
		return
	}
	return
}